package org.Iteration5.dominio;

import java.util.LinkedList;

import org.Iteration5.persistencia.Agente;

/* 2.2 version */

public class Partida {
		
	private LinkedList<Personaje> personajes;
	private GestorPersonaje gestor_personaje;
	private boolean pausa;
	
	public Partida() {
		/* persistence simulation.
		 * Read persistence part.
		 */
		personajes = new LinkedList<Personaje>();
		personajes.add(new Personaje("Gothmog", new Orco(), new Guerrero()));
		personajes.add(new Personaje("Urda", new Humano(), new Bárbaro()));
		personajes.add(new Personaje("Sylvana", new Elfo(), new Mago()));
		
		gestor_personaje = new GestorPersonaje();
		
		pausa = false;
	}
	
	public LinkedList<Personaje> getPersonajes() {
		return personajes;
	}
	
	public int elegirPersonaje(int index) {
		int valor_centinela = 0;
		
		try {
			gestor_personaje = new GestorPersonaje(personajes.get(index));
		}catch (IndexOutOfBoundsException e) {
			valor_centinela = -1;
		}
		
		return valor_centinela;
	}
	
	public void crearPersonaje(String nombre, Raza raza, Clase clase) {
		gestor_personaje.setPersonaje(nombre, raza, clase);
		gestor_personaje.guardarPersonaje();
	}
	
	public int realizarAtaquePrimario(Personaje personaje_receptor) {
		int daño, defensa, plus_agilidad, resultado;
		
		/* agility is a random plus to the attack */
		daño = gestor_personaje.getPersonaje().getAtaque();
		defensa = personaje_receptor.getRaza().getDefensa() +
				  personaje_receptor.getDefensa();
		plus_agilidad = personaje_receptor.getAgilidad();
		
		resultado = Math.abs(daño-defensa) + (int)(Math.random()*plus_agilidad);
		personaje_receptor.reducirSalud(resultado);
		
		return resultado;
	}
	
	public int realizarAtaqueSecundario(Personaje personaje_receptor) {
		int daño, defensa, resultado, posibilidad_contraataque;
		
		/* secondary attack is an attack with the special ability activated */
		gestor_personaje.getPersonaje().getClase().activarHabilidadEspecial();
		
		daño = gestor_personaje.getPersonaje().getAtaque();
		defensa = personaje_receptor.getRaza().getDefensa() +
				  personaje_receptor.getDefensa();
		
		resultado = Math.abs(daño-defensa);
		personaje_receptor.reducirSalud(resultado);
		
		/* improved to secondary attack is a counterattack of the receiver.
		 * The counterattack possibility varies depending on the agility  */
		posibilidad_contraataque = 200 / personaje_receptor.getAgilidad();
		if(Math.random() < posibilidad_contraataque )
			realizarContraataque(personaje_receptor);
		
		gestor_personaje.getPersonaje().getClase().desactivarHabilidadEspecial();
		
		return resultado;
	}
	
	public int realizarAtaqueMagia(Personaje personaje_receptor) {
			int daño, defensa, resultado;
			
			/* magic attack is an attack not depending on the
			 * strong but depending on the magic ability. */
			daño = gestor_personaje.getPersonaje().getMagia();
			defensa = personaje_receptor.getRaza().getDefensa() +
					  personaje_receptor.getDefensa();
			
			resultado = Math.abs(daño-defensa);
			personaje_receptor.reducirSalud(resultado);
			
			return resultado;
	}
	
	private void realizarContraataque(Personaje personaje_agresor) {
		int daño, defensa, resultado;
		
		daño = personaje_agresor.getAtaque();
		defensa = gestor_personaje.getPersonaje().getDefensa();
		resultado = Math.abs(daño - defensa);
		
		gestor_personaje.getPersonaje().reducirSalud((int)(resultado*0.25));
	}
	
	public String abrirCofre() {
		LinkedList<String> objetos = Agente.getObjetos();
		return objetos.get((int)Math.random()*objetos.size());
	}
	
	public void pausar() {
		pausa = true;
	}
	
	
}
